#!/bin/bash

# Descripcion: 	Comando que detecta la llegada de archivos al directorio '$grupo/ARRIDIR'.
#		Mueve archivos a la carpeta '$grupo/ACEPDIR' en caso de que el formato
#		del nombre del archivo sea correcto. En caso de que el nombre tenga un 
#		formato incorrecto, se reenvia a la carpeta '$grupo/RECHDIR'.
#		Luego invoca al comando 'interprete.sh'.

#ver donde se define grupo


nombre_interprete="Interprete.sh"

export TRUE=1
export FALSE=0

#*************************************************************************************************
# Funcion que detecta si hay archivos en una carpeta.
# Recibe como argumento 1 el nombre de la carpeta
# Retorna TRUE si existe al menos uno

function hay_archivos()
{
	local cant_archivos=$( ls -1 "$1" | wc --lines )
	if [ "$cant_archivos" -gt 0 ]	
	then
		return $TRUE 
	else
		return $FALSE
	fi		
}


#**************************************************************************************************

#**************************************************************************************************

#Valida si el parametro 1 es numerico o no. Espera un entero o un decimal con dos digitos.
function isValidNumber()
{
    res=$(echo $1 | grep "^\([0-9][0-9]\{0,\}\(.[0-9]\{2\}\)\{0,1\}\)$")
    #"
    if [ $res ]; then
	return 1
    else 
	return 0
    fi
}


#**************************************************************************************************

#**************************************************************************************************

#Valida si el parametro 1 es numerico o no y si es un mes valido. Espera un entero o un decimal con dos digitos.
function isValidMonth()
{
    res=$(echo $1 | grep "^\([0-9][0-9]\{0,\}\(.[0-9]\{2\}\)\{0,1\}\)$")
    if [ $res ]
    then
	# me fijo que ademas sea un numero valido para mes
	if [ $1 -gt 0 ] && [ $1 -lt 13 ]
	then
		return 1
	else
		return 0
	fi	
    else 
	return 0
    fi
}


#**************************************************************************************************

#**************************************************************************************************
# Funcion que retorna TRUE si el nombre de un archivo es valido, FALSE en caso contrario.
# Recibe un nombre de archivo. 
# Funcion que valida que el periodo del archivo sea mayor o igual que el periodo 
# Actual. Devuelve $TRUE en caso de que sea, $FALSE en caso contrario.


function nombre_valido()
{	

	local paisId=$(echo "$1" | cut -d'-' -f1)
	local sistemaId=$(echo "$1" | cut -d'-' -f2)
	local es_pais_sistema_valido=$( grep "^$paisId-[^-]*-$sistemaId.*" "$MAEDIR"/p-s.mae | wc -l) #busco la combinacion en el maestro

	if [ "$es_pais_sistema_valido" -ge 1 ]	
	then
		local mes_archivo=$(echo "$1" | cut -d'-' -f4)
		local anio_archivo=$(echo "$1" | cut -d'-' -f3)
		isValidMonth $mes_archivo
		local es_mes_numero_valido=$?
		isValidNumber $anio_archivo
		local es_anio_numero=$?

		
		if [ "$es_mes_numero_valido" -eq $TRUE ] && [ "$es_anio_numero" -eq $TRUE ]
		then
			#Verificamos que el periodo sea mayor o igual que el actual
			#periodo Actual
			periodo_anio_actual=$( date +%Y)
			periodo_mes_actual=$( date +%m)
			periodo_completo_actual="$periodo_anio_actual$periodo_mes_actual"
			periodo_completo_archivo="$anio_archivo$mes_archivo"

			#Comparo
			if [ "$periodo_anio_actual" -ge "$anio_archivo" ]  && [ "$anio_archivo" -ge 2001 ]
			
			then
				#if [ "$periodo_anio_actual" -eq "$anio_archivo" ]
				if [ "$periodo_completo_actual" -le "$periodo_completo_archivo" ]
				then
					#El mes debe ser menor o igual que el mes en curso.
					#if [ "$periodo_mes_actual" -lt "$mes_archivo" ]
					#then
					       "$BINDIR"/GlogY.sh DetectaY E "Error en el nombre de Archivo $archivo: No es un mes valido. Debe ser un  mes menor o igual al mes actual en el caso de que el anio al que corresponde el archivo sea igual que el anio en curso."		
					        
					return $FALSE	
                                        #fi
				else			
					#periodo menor o igual que el actual
					return $TRUE #bien
                                fi
			else
				"$BINDIR"/GlogY.sh DetectaY E "Error en el nombre de Archivo $archivo: No es un Anio valido. El anio debe ser mayor a 2000 y menor o igual al anio en curso."
			fi	

		else
			if [ "$es_mes_numero_valido" -eq $TRUE ]
			then
                            "$BINDIR"/GlogY.sh DetectaY E "Error en el nombre de Archivo $archivo: No es un Anio valido. El formato del anio debe ser YYYY y debe contener unicamente numeros."

			else
			    "$BINDIR"/GlogY.sh DetectaY E "Error en el nombre de Archivo $archivo: No es un mes valido. El mes debe estar comprendido entre 1 y 12 y si el archivo corresponde al anio en curso, debe ser un  mes menor o igual al mes actual."

			fi				
		fi
	else 
		"$BINDIR"/GlogY.sh DetectaY E "Error en el archivo $archivo: No es una combinacion de pais/sistema valido. Revise las combinaciones posibles."			

	fi
#ls -1 $1 | wc --lines
return $FALSE
}		

#***************************************************************************************

#***************************************************************************************
# Funcion que valida lo nombres de los archivos encontrados en la carpeta '$ARRIDIR'
# utilizando la funcion 'nombre_valido' para cada uno de los nombres.
#
# En caso de que un archivo tenga nombre valido, se lo mueve a la carpeta '$ACEPDIR',
# caso contrario se lo mueve a la carpeta 'RECHDIR'.

function validar_arribos()
{
#se establece cuál es el separador entre un elemento y el otro. En este caso espacios 
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

	for archivo in $( ls "$ARRIDIR" )
	do
		
		if [ ! -d "$archivo" ]	#si no es un directorio 
		then
			nombre_valido "$archivo"
			local es_valido="$?"
			if [ $es_valido -eq $FALSE ]	#si el nombre de archivo es valido
			then
				# lo muevo a la carpeta 'RECHAZADOS'
				"$BINDIR"/MoverY.sh "$ARRIDIR/$archivo" "$RECHDIR"
				"$BINDIR"/GlogY.sh DetectaY I "Se movió el archivo $archivo a $RECHDIR";
			else
				# lo muevo a la carpeta 'ACEPTADOS'
				"$BINDIR"/MoverY.sh "$ARRIDIR/$archivo" "$ACEPDIR"
				"$BINDIR"/GlogY.sh DetectaY I "Se movió el archivo $archivo a $ACEPDIR";
			fi
		fi
	done
}


# **************************************************************************************

# **************************************************************************************

#Funcion que inicia la ejecucion del valida si este no esta corriendo
function exec_interprete ()
{
	#Chequeo que el comando exista
	local existe=$( ls -1 "$BINDIR/$nombre_interprete" | wc --lines)

	local corre=$(ps -e | grep "$nombre_interprete" | wc --lines)

	if [ $corre -eq 0 ]
	then
		if [ $existe -ge 1 ] 
			then
			chmod u+x "$BINDIR/$nombre_interprete" 	#le da permisos de ejecucion
		
			#Invoco al interprete en background
			"$BINDIR/$nombre_interprete" &	
			"$BINDIR"/GlogY.sh DetectaY I "Interprete corriendo bajo el numero: $!"   

		else
			"$BINDIR"/GlogY.sh DetectaY E "Error al invocar al Interprete: no se encuentra el script"
		fi
	else
			"$BINDIR"/GlogY.sh DetectaY E "Interprete ya en ejecucion"

	fi
		
}


# ******************************************************************************************

#********************************************************************************************

hay_archivos "$ARRIDIR"

#ciclo principal

while [ $CANLOOP -gt 0 ]
do
	hay_archivos "$ARRIDIR"
	hay_archivos_arribos="$?"
	
	if [ "$hay_archivos_arribos" -eq $TRUE ]
	then
		validar_arribos "$ARRIDIR"
	fi
	
	hay_archivos "$ACEPDIR"
	hay_archivos_recibidos="$?"

	if [ "$hay_archivos_recibidos" -eq $TRUE ]
	then
		#Ejecutar interprete
		exec_interprete
	fi

	sleep "$TESPERA"
	CANLOOP=$(expr $CANLOOP - 1)

done

exit 0

